﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

namespace Canroc.Net.Core.Provider;

/// <summary>
///     微信支付事件回调提供器
/// </summary>
[UnifyModel(typeof(WeChatPayRestfulResult<>))]
public class WeChatPayEventProvider : IUnifyResultProvider
{
    /// <summary>
    ///     异常处理
    /// </summary>
    /// <param name="context">异常上下文</param>
    /// <param name="metadata">异常元数据</param>
    /// <returns></returns>
    public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
    {
        // 解析异常信息
        var exceptionMetadata = UnifyContext.GetExceptionMetadata(context);
        return new JsonResult(new WeChatPayRestfulResult<string>
        {
            Code = "FAIL", Message = exceptionMetadata.Errors.ToString() ?? ""
        }) { StatusCode = exceptionMetadata.StatusCode };
    }

    /// <summary>
    ///     成功处理
    /// </summary>
    /// <param name="context">动作执行上下文</param>
    /// <param name="data">数据</param>
    /// <returns></returns>
    public IActionResult OnSucceeded(ActionExecutedContext context, object? data)
    {
        data = context.Result switch
        {
            // 处理内容结果
            ContentResult contentResult => contentResult.Content,
            // 处理对象结果
            ObjectResult objectResult => objectResult.Value,
            EmptyResult => null,
            _ => data
        };

        return new JsonResult(
            new WeChatPayRestfulResult<string> { Code = "SUCCESS", Message = data?.ToString() ?? "" });
    }

    /// <summary>
    ///     验证失败处理
    /// </summary>
    /// <param name="context">动作执行上下文</param>
    /// <param name="metadata">验证元数据</param>
    /// <returns></returns>
    public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
    {
        return new JsonResult(new WeChatPayRestfulResult<string> { Code = "FAIL", Message = "验证失败" });
    }

    /// <summary>
    ///     响应状态码处理
    /// </summary>
    /// <param name="context">Http请求上下文</param>
    /// <param name="statusCode">Http返回状态码</param>
    /// <param name="unifyResultSettings">统一结果设置选项</param>
    /// <returns></returns>
    public async Task OnResponseStatusCodes(HttpContext context, int statusCode,
        UnifyResultSettingsOptions unifyResultSettings)
    {
        await context.Response.WriteAsJsonAsync(new WeChatPayRestfulResult<string> { Code = "FAIL", Message = "" });
    }

    /// <summary>
    ///     授权异常处理
    /// </summary>
    /// <param name="context">Http请求上下文</param>
    /// <param name="metadata">异常元数据</param>
    /// <returns></returns>
    public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata)
    {
        return new JsonResult(new WeChatPayRestfulResult<string> { Code = "FAIL", Message = "验证失败" });
    }
}